/**
 * @addtogroup sfc_mutex.h
 * sfc_mutex.h
 * @{
 */
/**
 * @file sfc_mutex.h
 * @brief 定义CriticalSection类
 * @note
 * @author Leo
 * @date 2020-03-30
 * @version 1.1

 * @par          修改日志
 * <table>
 * <tr><th>Date <th>Version <th>Author <th>Description
 * <tr><td>2019-07-06 <td>1.0 <td>Leo <td> 创建初始版本
 * <tr><td>2020-03-30 <td>1.1 <td>Leo <td> TSfCriticalSectionEnter去掉超时参数,默认为无限等待 
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */
#ifndef _SFC_MUTEX_H_
#define _SFC_MUTEX_H_

#include <ofc_object.h>
#include "sfc_api.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 构造临界区类
 * @par 示例
 * @code
   main:
   TSfCriticalSection lock;
   TSfCriticalSectionCreate(&lock);
   ...
   OfDestroyObject((TOfObject *)&lock);
      
   Thread A:

   ...
   TSfCriticalSectionEnter(&lock);
   ...
   TSfCriticalSectionLeave(&lock);

   Thread B:
   TSfCriticalSectionEnter(&lock);
   ...
   TSfCriticalSectionLeave(&lock);

 * @endcode
*/
typedef struct TSfCriticalSectionTag TSfCriticalSection;
struct TSfCriticalSectionTag
{
PROTECTED
    TOfObject parent_;
    TOfVirtualMethod Destroy_;

PRIVATE
    TSfCriticalSectionHandle handle_;
};

/**
 * 临界区类的构造函数
 * @param self: 对象实例指针
 * @return 创建成功返回True,否则返回False
 */
Bool TSfCriticalSectionCreate(TSfCriticalSection *self);

/**
 * 创建临界区对象
 * @return 创建成功返回创建的对象,创建失败返回NULL
 */
TSfCriticalSection *SfCreateCriticalSection(void);

/**
 * 获得临界区.当前线程如果获得临界区,则当前线程就是临界区的所有者,直到当前线程调用[TSfCriticalSectionLeave](@ref TSfCriticalSectionLeave)释放临界区
 * @param self: 对象实例
 * @return 返回true表示获得临界区成功.否则表示获得临界区失败
 */
Bool TSfCriticalSectionEnter(TSfCriticalSection *self);

/**
 * 释放临界区
 * @param self: 对象实例
 * @return 无返回值
 */
void TSfCriticalSectionLeave(TSfCriticalSection *self);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // _SFC_MUTEX_H_

/**
 * @}
 */
